package server

/*
	本函数启动后，通过 发送请求实现对数据库的增删改查
*/
import (
	"manage-service/tools"

	"github.com/gin-gonic/gin"

	"encoding/json"
	"fmt"
	"log"
	"net/http"
)

// 监听Ip端口
const (
	HttpIp   = ""
	HttpPort = 8081
)

func HttpGin() {
	r := gin.Default()

	r.GET("/search", func(context *gin.Context) {
		ip := context.Query("ip")
		metric := context.Query("metric")
		// 通过 ip 和 metric 查询
		data := tools.GetDataByIpAndMetric(ip, metric)

		if err := context.ShouldBind(&data); err == nil {
			context.JSON(http.StatusOK, data)
		} else {
			context.JSON(http.StatusBadRequest, gin.H{"err": err.Error()})
		}
	})

	r.POST("/add", func(context *gin.Context) {
		// 从Request body中读取请求数据
		body, err := context.GetRawData()
		if err != nil {
			log.Printf("read request error, err:%v\n", err)
		}
		var slice []*tools.Table

		// 将请求体反序列化成json
		err = json.Unmarshal(body, &slice)
		if err != nil {
			// 解析失败会报错，如json字符串格式不对，缺"号，缺}等。
			fmt.Println("json.Unmarshal err: ", err)
		}
		// 初始化数据库
		err = tools.InitDB()
		if err != nil {
			log.Printf("数据库初始化失败, err:%v\n", err)
			return
		}

		for i := 0; i < len(slice); i++ {
			err = slice[i].InsertData()
		}

		if err == nil {
			context.JSON(http.StatusOK, "插入成功")
		} else {
			context.JSON(http.StatusBadRequest, "插入失败")
		}
	})

	r.DELETE("/delete", func(context *gin.Context) {
		ip := context.Query("ip")
		metric := context.Query("metric")
		if ip == "" || metric == "" {
			context.JSON(http.StatusBadRequest, "Request parameter is NULL!")
			return
		}
		tbl := &tools.Table{}
		tbl.Ip = ip
		tbl.Metric = metric
		if err := tbl.DeleteData(); err == nil {
			context.JSON(http.StatusOK, "删除成功")
		} else {
			context.JSON(http.StatusBadRequest, "删除失败")
		}
	})

	r.PUT("/update", func(context *gin.Context) {
		// 从Request body中读取请求数据
		body, err := context.GetRawData()
		if err != nil {
			log.Printf("read request error, err:%v\n", err)
		}
		// 新建Table对象
		tbl := &tools.Table{}
		// 将请求体json反序列化成Table类型
		err = json.Unmarshal(body, tbl)
		if err != nil {
			// 解析失败会报错，如json字符串格式不对，缺"号，缺}等。
			fmt.Println("json.Unmarshal err: ", err)
		}
		if err := tbl.UpdateData(); err == nil {
			context.JSON(http.StatusOK, "更新成功")
		} else {
			context.JSON(http.StatusBadRequest, "更新失败")
		}

	})

	err := r.Run(fmt.Sprintf("%s:%d", HttpIp, HttpPort))
	if err != nil {
		log.Printf("router run failed, err:%v\n", err)
		return
	}
}
